序列标注模型用到了长短期记忆网络(LSTM),条件随机场(CRF),Highway网络,本文循序渐进的介绍了序列标注算法,Be patience ! 跟着小编的文章完全搞懂序列标注算法吧。
1.目标
序列标注模型的目标是用实体或词性标记句子的每个单词,如下图:

其中PER标记的是人名,LOC标记的是位置,ORG标记的是组织。
算法原理来自论文Empower Sequence Labeling with Task-Aware Neural Language Model,论文所述的序列标注模型算法比大部分算法都要高级,文章将要介绍很多常用的理论,不仅仅应用在序列标注领域,该模型的一个特点是并行训练了语言模型,增强了序列标注的任务。
为了更好的理解序列标注模型,首先介绍几个概念:
2.需要理解的几个概念
序列标注:标注句子中每个单词的实体或词性
语言模型:语言模型是预测单词或字符序列中的下一个单词或字符,神经语言模型在文本生成、机器翻译、图像理解、光学字符识别等各种NLP任务中取得了令人印象深刻的结果。
字符RNN:对文本中的单个字符进行RNN转换,在序列标注任务中,字符可以为单词的实体或属性提供重要线索,如形容词通常以”-y”或”-ul”结尾,位置通常以”-land”或”burg”结尾,因此编码句子中的字符信息是很有必要的。
多任务学习(Multi-Task Learning):模型训练过程中包含了语言模型,语言模型为序列标注模型提供了额外的有用信息,即改善了序列标注模型。
条件随机场(Conditional Random Fields):离散分类器根据某个单词预测其标注,条件随机场是根据该单词附近的单词标注来预测其标注,这是符合理论的,因为单词的标注不仅仅取决于当前的单词,还取决于该单词相邻的单词属性。
维特比解码(Viterbi Decoding):我们使用了CRF输出每个单词的标记转移矩阵,然后通过维特比解码输出最优的标记序列。
Highway Networks(Highway网络):全连接层在任何神经网络结构中转换或提取不同位置特征的主要成分,如图像分类中,全连接层输出用于分类图像的特征,语言模型中,全连接层输出每一个类的概率。
3.算法模型框架
算法模型框架即LM-LSTM-CRF,LM-LSTM-CRF包含了三个模型:语言模型(LM),长短期记忆网络(LSTM),条件随机场(CRF)。语言模型的训练并行在长短期记忆网络和条件随机场组成的序列标记模型,组成多任务训练模型。
模型框架如下图:

上图右边的红色方框所展示的是序列标注模型的框架流程,下图细化了该模型流程,让大家有个宏观的理解:


下面一一介绍该模型框架的结构部分:
3.1 多任务学习(Multi -Task Learning)
由上表可知,在训练序列标注模型的同时也并行了语言模型训练,这样做的好处是使训练过程中获得了更多的信息,提高了序列标注模型的性能。
多任务学习的损失函数是各个任务损失函数的权值相加,如下式:

本文设置
等于1。
梯度下降法更新模型参数:

其中
为学习率。
3.2 字符LSTM
前向字符LSTM和后向字符LSTM都用于语言模型的单词预测,也用于序列标注模型的输入。
假设句子是dunston checks in ,前向字符LSTM的结构如下图:

后向字符LSTM结构图:

3.3 单词双向LSTM和条件随机场
单词双向LSTM和条件随机场用来预测序列标注模型每个单词的观测分数矩阵和转移分数矩阵之和。如下图:

若句子长度为L,单词标注种类数为m,那么每个单词标注转移分数矩阵的大小为(L,m,m),观测分数矩阵的大小为(L,m)。
条件随机场输出这两者之和的总分数,矩阵大小为(L,m,m),位置(k,i,j)的值等于
第k个单词第j个标记的观测分数与第k个单词前一个单词标注为i,后一个单词标注为j的观测分数之和。
比如句子dunston checks in ,如果标注种类数为5,总分数矩阵会是这样:

细心的读者可能发现,条件随机场不输出符号的总分数,因为每个句子都是以开头,计算的观测分数和转移分数没有任何意义。
从上图也得到了两个小细节:
给定前一个单词的标注为,某个标注的转移分数表示该标注成为句子中第一个标注的可能性,比如句子通常以冠词(a,an,the)或名词,代词开头。
给定后一个单词的标注为,某个标注的转移分数表示该标注成为句子中最后一个标注的可能性。
我们现在知道了模型输出的矩阵总分数,如何计算当前模型的损失函数?
4.维特比损失(Viterbi loss)
若仅仅只有标注观测分数,那么小编推荐使用交叉熵损失函数去计算,若包含了转移矩阵分数,则用维特比损失算法。
还是用之前的总分数为例,如下图:

定义序列标注t的得分等于每个标注得分的总和,有:

若句子的真实标注为:tag2,tag3,tag3,,则该序列标注的得分等于:4.85 + 6.79 + 3.85 +3.52 = 19.01。
因此,维特比损失定义为:

其中
表示真实的标注序列,T表示所有可能的标注序列。
简化上式得:

若经过多次迭代的反馈训练,得到单词最终的预测总分数,如何预测句子中最优的标注序列?
5.维特比解码(Viterbi Decoding
不管是什么句子,有两个标注我们是确定的:和标记,维特比预测最优标注序列的思想是:通过去逐步累加每个单词的总分数,当更新到标注时,由于标注是确定的,然后通过标注的总分数反向预测每个单词的最优序列。
通过一个来阐述这一思想,还是用之前每个单词的总分数为例:
第一个单词为dunston,前一个标注肯定为,于是第一个单词的累加分数为:

第二个单词为checks,则第二个单词的累加分数为:

存储该单词所属每个标注的最大分数和前一个标注:

第三个单词为in,则第三个单词的累加分数为:

存储该单词所属每个标注的最大分数和前一个标注:

第四个单词为符号,则第四个单词的累加分数为:

存储该单词所属每个标注的最大分数和前一个标注:

因为第四个单词为标注肯定为,因此选择该标注最大分数时的前一个标注,由上图可知为tag3,然后重复该步骤,如下图:

由上图可知,最优标注序列为:,,,。
5.Highway Networks
语言模型和序列标注模型都用到了highway网络,该网络与偏差网络有点相似,偏差网络(residual networks)的输出等于将输入添加到转换后的输出,为数据流的转换创建路径。
偏差网络结构图:

若转换层个数等于1,转换函数为f(x),则有:

Highway网络与偏差网络有点相似,它使用sigmoid-activated门来确定输入和转换后输出的系数,因此Highway网络的输出为:

模型有三个地方要用到Highway网络:
Highway网络将前向字符LSTN的输出预测为下一个单词的分数
Highway网络将后向字符LSTN的输出预测为下一个单词的分数
前向字符LSTM和后向字符LSTM的输出拼接起来,然后用Highway网络转换,并与单词的嵌入向量作为单词双向LSTM的输入。
结合字符前向LSTM,字符后向LSTM,双向单词LSTM以及条件随机场的介绍,序列标注算法模型结构图如下:

6.其他的序列标注模型简述

图(a)与本文介绍的模型很相似,但是该模型是单任务学习,即不包含语言模型。
图(b)是单任务学习,且没有利用句子的字符信息,该模型在工业界十分普及且性能较好。
图(c)是单任务学习,使用了线性层或Highway层代替条件随机场,即直接预测每个单词所属标记的分数,性能相比之前的模型较差。
7.总结
小编花了较长的时间来整理序列标注的算法,也尽可能的把模型的网络结构解释清楚,文章开头和末尾都涉及了算法的流程框架图,对于一个较复杂的模型,理解模型的流程框架是必要的。后面的文章会涉及该算法的代码,请持续关注小编吧!
参考
https://github.com/sgrvinod/a-PyTorch-Tutorial-to-Sequence-Labeling
获取参考文章pdf,可扫码添加小编微信获取:
